package com.freecloud.javabasics.thread.simple;

import com.freecloud.common.LoggerUtil;

/**
 * Volatile关键字
 * 保证多线程可见性
 * 语言级<编译级别>使用关键字解决（可见性的根本原因：高速缓存、重排序）
 * CPU提供内存屏障指令（读屏障、写屏障、全屏障）通过EMSI协议
 *
 * happens-before概念，用于理解
 * 1. 程序顺序规则
 * 2. volatile规则
 * 3. 传递性规则
 * 4. start规则（在线程执行之前）
 * 5. join规则
 * 6. synchronized监视器锁规则
 *
 * @Author: maomao
 * @Date: 2020-02-16 10:32
 */
public class VolatileDemo {

    /**
     * 不使用关键字，线程无法停止(使用CPU缓冲区，无法重新读取内存新值)
     */
    //public static boolean stop = false;
    /**
     * 使用volatile关键字可保证线程读取主线程变量（可见性，确保每次都读取内存最新值，保证变量可见性）
     */
    public volatile static boolean stop = false;

    private volatile static String volatileStr = "test string";

    public static void main(String[] args) throws InterruptedException {

        Thread t1 = new Thread(()->{
            int i = 0;
            while (!stop){
                i++;
                volatileStr = "test string update";
            }
            LoggerUtil.printThread("停止线程！");
        });

        t1.start();
        Thread.sleep(1000);
        LoggerUtil.printThread("修改stop为 true");
        //更改标识为
        stop = true;
        LoggerUtil.printThread("" + Thread.currentThread().getThreadGroup());
    }
}
